//无块级作用域 外部也能访问
// if (true) {
//     var foo = 'zce'
// }
// console.log(foo);

//块级作用域  外部无法访问  会报错
// if (true) {
//     let foo = 'zce'
// }
// console.log(foo);

//---------------------------------

//var 为全局  仅打印三次
// for(var i = 0; i<3; i++){
//     for(var i = 0; i < 3; i++){
//         console.log(i);
//     }
//     console.log('内层结束 i =' + i);
// }

//let 为块级  因此会打印九次
//不建议使用同名的计数器
// for(let i = 0; i<3; i++){
//     //实际解决问题的是内部let
//     for(let i = 0; i < 3; i++){
//         console.log(i);
//     }
//     console.log('内层结束 i =' + i);
// }


//--------------------------------------

//循环注册事件
// var elements = [{}, {}, {}]
// for (var i = 0; i < elements.length; i++) {
//     //由于注册事件为下一次宏任务 i为全局变量 因此事件执行打印时i都为3
//     elements[i].onclick = function () {
//         //此时i 都是3
//         console.log(i);
//     }
// }
// elements[0].onclick()


//使用闭包来解决问题
// var elements = [{}, {}, {}]
// for (var i = 0; i < elements.length; i++) {
//     //立即执行函数 使用函数作用域摆脱全局作用域的影响
//     elements[i].onclick = (function (i) {
//         return function () {
//             console.log(i);
//         }
//     })(i)
// }
// elements[0].onclick()


//块级作用域
// var elements = [{}, {}, {}]
// for (let i = 0; i < elements.length; i++) {
//     elements[i].onclick = function () {
//         console.log(i);
//     }
// }
// elements[0].onclick()


//---------------------------------------------------------

// let 会形成一个闭包 
// for (let i = 0; i < 3; i ++) {
//     let i = 'foo'
//     //正常打印  互不影响
//     console.log(i);
// }

// let i = 0

// if (i < 3) {
//     let i = 'foo'
//     console.log((i));
// }

// i++


//---------------------------------------------------

// let的变量声明不会提升  var的变量声明会提升到最开始
// console.log(foo);
// var foo = 'zce'

//let必须先声明再使用
// console.log('foo');
// let foo = 'zce'
